using System;

namespace Test
{
    class Game
    {
        private bool _isRunning = true;
        private List<GameObject> _gameObjects = new List<GameObject>();  // 一个游戏内存在多个游戏对象，一个游戏对象包含多个组件 每创建一个组件component传递给一个游戏对象为其添加

        // 对_isRunning 设置一个set、get控制
        public bool IsRunning
        {
            get{ return _isRunning; }
            set{ _isRunning = value; }
        }
        
        public Game()
        {
            Console.WriteLine("Game add!");
        }

        public bool Initialize()  // 初始化
        {
            StartGame();
            return true;
        }

        public void RunLoop()  // 循环
        {
            while(_isRunning)
            {
                ProcessInput();
                UpdateGame();
            }
        }

        public void ShutDown()  // 退出
        {
            Console.WriteLine("Game shutdown...");
        }

        public void AddGameObject(GameObject obj)
        {
            _gameObjects.Add(obj);
        }

        public void RemoveGameObject(GameObject obj)
        {
            _gameObjects.Remove(obj);
        }

        private void StartGame()
        {
            Console.WriteLine("Game start...");
            LoadData();
            // 将每个游戏对象的start启动，每个游戏对象启动其加载的每个组件的start
            foreach(var obj in _gameObjects)
            {
                obj.Start();
            }
        }

        private void ProcessInput()  // 处理用户交互
        {
            // Console.WriteLine("Game input...");
            while(Console.KeyAvailable)  // 判断是否按键
            {
                ConsoleKey ck = Console.ReadKey(true).Key;// 获取按钮是什么
                if (ck == ConsoleKey.Q)
                {
                    // 如果按Q键
                    _isRunning = false;  // 退出游戏
                }
            }
        }

        private void UpdateGame()  // 循环处理渲染资源
        {
            Console.WriteLine("Game update...");
            foreach(var obj in _gameObjects)
            {
                obj.Update();
            }
        }

        private void LoadData()
        {
            // 创建游戏对象
            GameObject ob1 = new GameObject();
            GameObject ob2 = new GameObject();

            // 给游戏添加游戏对象
            AddGameObject(ob1);
            AddGameObject(ob2);

            // 给游戏添加游戏组件
            SphereComponent sc1 = new SphereComponent(ob1);
            SphereComponent sc2 = new SphereComponent(ob2);
            TransformComponent tc1 = new TransformComponent(ob1);
            TransformComponent tc2 = new TransformComponent(ob2);
            // 加载入游戏后游戏通过调用其游戏对象的start、update从而调用每个组件的start、update从而完成整体的一个初始化工作。
        }
    }
}